package config

import (
	"encoding/json"
	"fmt"
	"os"
	"path/filepath"
	"sync"
)

// LoginConfig 登录配置
type LoginConfig struct {
	LoginID             string `json:"loginId,omitempty"`
	LoginKey            string `json:"loginKey,omitempty"`
	RememberCredentials bool   `json:"rememberCredentials,omitempty"`
}

// Config 应用配置
type Config struct {
	Login LoginConfig `json:"login"`
	// 可以添加其他配置项
}

// ConfigManager 配置管理器
type ConfigManager struct {
	configPath string
	config     *Config
	mu         sync.RWMutex
}

var (
	instance *ConfigManager
	once     sync.Once
)

// GetConfigManager 获取配置管理器单例
func GetConfigManager() *ConfigManager {
	once.Do(func() {
		// 获取配置目录（用户配置目录）
		configDir, err := os.UserConfigDir()
		if err != nil {
			configDir = "."
		}
		configDir = filepath.Join(configDir, "go-vue3-ts-nativeUI-unocss")

		// 确保配置目录存在
		if err := os.MkdirAll(configDir, 0755); err != nil {
			panic(fmt.Sprintf("创建配置目录失败: %v", err))
		}

		configPath := filepath.Join(configDir, "config.json")

		instance = &ConfigManager{
			configPath: configPath,
			config:     &Config{},
		}

		// 加载配置
		instance.loadConfig()
	})

	return instance
}

// loadConfig 加载配置
func (c *ConfigManager) loadConfig() {
	c.mu.Lock()
	defer c.mu.Unlock()

	// 如果配置文件不存在，使用默认配置
	if _, err := os.Stat(c.configPath); os.IsNotExist(err) {
		c.config = &Config{}
		return
	}

	// 读取配置文件
	data, err := os.ReadFile(c.configPath)
	if err != nil {
		c.config = &Config{}
		return
	}

	// 解析配置
	if err := json.Unmarshal(data, c.config); err != nil {
		c.config = &Config{}
		return
	}
}

// GetLoginConfig 获取登录配置
func (c *ConfigManager) GetLoginConfig() *LoginConfig {
	c.mu.RLock()
	defer c.mu.RUnlock()

	if c.config == nil {
		return &LoginConfig{}
	}

	// 返回配置副本，避免并发修改
	config := c.config.Login
	return &config
}

// SetLoginConfig 设置登录配置
func (c *ConfigManager) SetLoginConfig(config *LoginConfig) error {
	c.mu.Lock()
	defer c.mu.Unlock()

	if c.config == nil {
		c.config = &Config{}
	}

	c.config.Login = *config

	// 保存配置
	return c.saveConfig()
}

// saveConfig 保存配置到文件
func (c *ConfigManager) saveConfig() error {
	// 确保配置目录存在
	dir := filepath.Dir(c.configPath)
	if err := os.MkdirAll(dir, 0755); err != nil {
		return err
	}

	// 序列化配置
	data, err := json.MarshalIndent(c.config, "", "  ")
	if err != nil {
		return err
	}

	// 写入文件
	return os.WriteFile(c.configPath, data, 0644)
}
